<?php
final class Dir{//这个类不需要继承，加上final
    
    
    /**
     * 遍历树，遍历文件和目录的
     * @param type $dir目录
     * @return type
     */
    static public function  tree($dir){
        $path=  Dir::dirPath($dir);//修正路径
        $dirs=  glob($path."/*");//返回目录下所有文件或目录，是数组
        $arr=array();//上一行返回的东西存在  数组中
        foreach ($dirs as $k=>$d){//遍历数组
                //print_r(pathinfo($d));
                //以下是把pathinfo($d)中的各个信息压入$arr中
            $arr[$k]['filename']=str_replace(dirname($d).'//','',$d);//获得文件名   现编码为utf-8，不需要用iconv函数转码
            $arr[$k]["filemtime"]=  filemtime($d);//文件的修改时间
            $arr[$k]['iswrite']=  is_writeable($d);//文件是否可写
            $arr[$k]['isread']= is_readable($d);//文件是否可读
            $arr[$k]["type"]=  is_dir($d)?"dir":"file"; //判断是目录还是文件
            $arr[$k]["path"]= str_replace("\\",'/',realpath($d));   //realpath($d)返回规范化的绝对路径名  str_replace 是修正斜杠
        }
       return $arr;  // 返回$arr
    }

    
    
    
       /**
        * 删除目录或文件类
        * @param string $dirName目录或文件名
        * @return boolean
        */
    static public function del($dirName){
        if(!file_exists($dirName)){//判断目录是否存在
            return FALSE;
        }
        if(is_file($dirName)){
            return @unlink($dirName);//判断是不是文件
        }
        $files=  glob($dirName."/*");//遍历文件下的东西
        foreach ($files as $f){
            is_file($f)?@unlink($f):Dir::del($f);//三元表达式
        }
        return rmdir($dirName);
    }
    
    
    
    
    
    /**
     * 创建目录
     * @param string $dir目录或名称如a\b\c
     * @param type $auth  权限位如0755
     * @return type
     */
    static public function create($dir,$auth=0755){
        $dir=  self::dirPath($dir);//调用路径兼容解决
        if(is_dir($dir))continue;
        $dirs=  explode("/", $dir); //拆分字符串成数组
        $path="";
        foreach ($dirs as $d){//遍历数组
            $path.=$d."/";
            if (is_dir($path))continue;//判断目录是否存在，存在继续
            mkdir($path,$auth);//不存在创建
        }
        return is_dir($dir);
    }
    
    /**
     * 解决window和linux兼容路径问题(规范路径)
     * @access private
     * @param type $dir
     * @return type
     */     
    static private function dirPath($dir){
        $dir=str_replace("\\", "/", $dir);
        return substr($dir, -1)=="/"?$dir:$dir."/";//截取最后一个字符，没有连接上"/"
    }
    
    
    
    

    /**
     * 目录复制
     * @param type $sdir源目录
     * @param type $todir目标目录
     * @param type $del目标目录下的文件是否删除
     * @return boolean
     */
    static public function copy($sdir,$todir,$del=false){
        $sdir=  self::dirPath($sdir);//规范源目录路径
        $todir=  self::dirPath($todir);//规范目标目录路径
        if(!is_dir($sdir)){
            return FALSE;//判断源目录是否存在，不存在返回false
        }
        if(!is_dir($todir)){
            self::create($todir);//判断目标目录是否存在，不存在创建
        }
        foreach(glob($sdir.'*') as $v){
            $to=$todir.basename($v);
            if(is_dir($v)){
                Dir::copy($v, $to);//判断是不是目录，是递归
            }  else {
                //是否覆盖目标文件
                is_file($to)&&$del&&@unlink($to);//如果$to是个文件并且让我删除  就删掉
                is_file($to) ||  copy($v, $to);//判断$to是不是文件，是什么都不做，不是复制$v到$to
            }             
        }
    }
    
    
    
    
    
    
    
}
//echo "<pre>";
//print_r(Dir::tree(".."));
//Dir::del("a");
//Dir::create("a/b/c");

?>
